package com.zxg.androidbuslearn.datasave

import android.app.Activity
import android.content.Context
import android.os.Environment
import java.io.*
import java.lang.Exception
import java.util.*

/**
 * 作者: 赵小刚
 * 生成时间: 2018/11/15.
 * 版本: 1.0
 * 简介:
 * 修改记录:
 */
class DataUtil {

    companion object {

        var mKey = "mKey"

        /**
         * 保存数据到内存
         * @param obj 要保存的数据
         * @return true/false 成功/失败
         */
        fun writeMemoryData(context: Context, obj: Any): Boolean {
            var bool = false
            var fos: FileOutputStream? = null
            try {
                // 构建 Properties
                val properties = Properties()
                // Properties 添加数据
                properties.put(mKey, obj)
                fos = context.openFileOutput("testmemory.json", Context.MODE_PRIVATE)
                // 将数据写入文件流
                properties.store(fos, "测试文件")
                bool = true
            } catch (e: FileNotFoundException) {
                e.printStackTrace()
            } catch (e: IOException) {
                e.printStackTrace()
            } finally {
                if (fos != null) {
                    try {
                        fos.close()
                    } catch (e: IOException) {
                        e.printStackTrace()
                    }
                }
            }
            return bool
        }

        /**
         * 读取内存数据
         * @param key 数据对应的键值
         * @return 待读取的数据
         */
        fun readMemoryData(context: Context, key: String): Any? {
            var obj: Any? = null
            var fis: FileInputStream? = null
            try {
                // 构建Properties
                val properties = Properties()
                fis = context.openFileInput("testmemory.json")
                // 加载文件
                properties.load(fis)
                // 读取数据
                obj = properties[key]
            } catch (e: FileNotFoundException) {
                e.printStackTrace()
            } catch (e: IOException) {
                e.printStackTrace()
            } finally {
                try {
                    if (fis != null)
                        fis.close()
                } catch (e: IOException) {
                    e.printStackTrace()
                }
            }
            return obj
        }

        /**
         * 写入数据到SD卡
         * @param obj 要保存的数据
         * @return true/false 成功/失败
         */
        fun writeSdData(context: Context, obj: Any) : Boolean {
            var bool = false
            // 判断外部存储是否可读可写
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                // 写入方式1：RandomAccessFile 可以指定文件写入的位置
                var raf: RandomAccessFile? = null
                try {
                    // 获取SD卡路径
                    val sdDir = Environment.getExternalStorageDirectory()
                    // 获取SD卡目录 /mnt/sdcard
                    val sdPath = sdDir.absolutePath
                    // 创建文件
                    val file = File(sdPath, "testsd.json")
                    if (!file.exists()) {
                        val bool1 = file.createNewFile()
                        if (!bool1)
                            return false
                    }
                    // 指定文件创建RandomAccessFile对象
                    raf = RandomAccessFile(file, "rw")
                    // 将文件记录指针移动到最后
                    raf.seek(file.length())
                    // 写入内容
                    raf.write(obj.toString().toByteArray())

                    /*// 写入方式2：使用FileOutputStream写入数据.
                    // FileOutputStream只提供了FileOutputStram(File file, boolean append)方法。
                    // append为true时，在文件尾部写入。append为false时，会覆盖之前的文件
                    var fos: FileOutputStream? = null
                    fos = FileOutputStream(file)
                    fos.write(obj.toString().toByteArray())
                    // final里添加关闭
                    try {
                        if (fos != null)
                            fos.close()
                    } catch (e: IOException) {
                        e.printStackTrace()
                    }*/

                    bool = true
                } catch (e: FileNotFoundException) {
                    e.printStackTrace()
                } catch (e: IOException) {
                    e.printStackTrace()
                } finally {
                    try {
                        if (raf != null)
                            raf.close()
                    } catch (e: IOException) {
                        e.printStackTrace()
                    }
                }
            }
            return bool
        }

        /**
         * 读取SD卡中的内容
         * @return 待读取的数据
         */
        fun readSdData(context: Context) : String {
            val sb = StringBuilder()
            // 判断外部存储是否可读可写
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                // 获取SD卡路径
                val sdDir = Environment.getExternalStorageDirectory()
                // 获取SD卡目录 mnt/sdcard
                val sdPath = sdDir.absolutePath
                // 创建文件
                val file = File(sdPath, "testsd.json")

                var ism: InputStream? = null
                try {
                    ism = FileInputStream(file)
                    val buffer = ByteArray(1024)
                    var len: Int
                    while (true) {
                        len = ism.read(buffer)
                        if (len != -1) {
                            sb.append(String(buffer, 0, len))
                        } else {
                            break
                        }
                    }
                } catch (e: FileNotFoundException) {
                    e.printStackTrace()
                } catch (e: IOException) {
                    e.printStackTrace()
                } finally {
                    try {
                        if (ism != null) {
                            ism.close()
                        }
                    } catch (e: IOException) {
                        e.printStackTrace()
                    }
                }
            }
            return sb.toString()
        }
    }
}
